package com.foreknow.reflection;


import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Hashtable;

/**
 * Java中的反射机制（动态机制）：他是Java中非常重要的特性
 * 反射的特点：
 * 1.在程序运行的时候可以判断任意一个对象所属的类
 * 2.也可以在运程的时候获取到类的对象
 * 3.在运行的时候可以获取到累的成员变量以及方法
 *
 * 反射的几种常用写法
 * 1.Class。forName("java.lang.Integer")
 *
 * 2.ReflectionDemo.class     UserMapper mapper = session.getMapper(UserMapper.class)
 *
 * 3.getClass()
 */
public class ReflectionDemo {

    public void getNameTest(){
        String name = "tom123";
        Class clazz = name.getClass();
        System.out.println("String类的名称为:"+clazz.getName());

        Button button = new Button();
        //调用getClass方法来获取到类Class，然后调用getName获取类名
        Class clazzButton = button.getClass();
        System.out.println("Button类的名称为:"+clazzButton.getName());
        Class clazzSuperButton = clazzButton.getSuperclass();
        System.out.println("Button父类的名称为:"+clazzSuperButton.getName());


    }

    public String testMethod(String str, Hashtable hashtable){
        String returnStr = "这是我们当前方法要返回的数据";
        System.out.println("获取到map中的数据"+hashtable.get("name"));
        return returnStr;
    }


    /**
     * 通过java中的反射来调用testMethod(String str, Hashtable hashtable)方法
     */
    public void getMethodTest() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //获取到类对象
        Class cls = Class.forName("com.foreknow.reflection.ReflectionDemo");
        //方法的参数列表Class[]   声明一个类型数组
        Class[] ptypes = new Class[2];
        ptypes[0] = Class.forName("java.lang.String");
        ptypes[1] = Class.forName("java.util.Hashtable");

        //获取到当前对象中的方法名testMethod(String str, Hashtable hashtable)
        Method method = cls.getMethod("testMethod",ptypes);
        //可以通过 Object invoke(Object obj, Object... args)对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
        Object[] args = new Object[2];
        args[0] = "这是一个实参str(abc)";
        Hashtable hashtable = new Hashtable();
        hashtable.put("name","fender......");
        args[1] = hashtable;
        //调用方法ReflectionDemo中的testMethod方法
        String str = (String) method.invoke(new ReflectionDemo(),args);
        System.out.println(str);

    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        ReflectionDemo reflectionDemo = new ReflectionDemo();
        reflectionDemo.getMethodTest();
//        reflectionDemo.getNameTest();
//        Hashtable<String,Integer> map = new Hashtable<>();
//        map.put("name",1);
//        reflectionDemo.testMethod("abc",map);
    }
}
